package aerolinea;

import java.math.BigDecimal;
import java.util.Collection;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;

import busqueda.Busqueda;


import asiento.Asiento;
import asiento.Asiento.ClaseAsiento;
import asiento.Asiento.UbicacionEnAvion;


public abstract class Aerolinea {
	private BigDecimal porcentajeImpuesto;
	
	public abstract Collection<Asiento> obtenerAsientosDisponibles(Busqueda busqueda);
	public abstract void comprarAsiento(Asiento asiento);

	public Collection<Asiento> buscarAsientos(Busqueda busqueda) {
		return this.filtrarBusqueda(this.obtenerAsientosDisponibles(busqueda), busqueda);	
	}

	protected Collection<Asiento> filtrarBusqueda(Collection<Asiento> colAsientos, Busqueda busqueda) {
		
		colAsientos = filtrarPorClaseDelAsiento(colAsientos, busqueda.getClaseAsiento());

	    colAsientos = filtrarPorUbicacionAsiento(colAsientos, busqueda.getUbicacionEnAvion());

		return colAsientos;
	}
	
	@SuppressWarnings("unchecked")
	protected Collection<Asiento> sacarSuperOfertas(Collection<Asiento> colAsientos) {
		Predicate filtroPorSuperOferta = new Predicate() { 
			@Override
			public boolean evaluate(Object arg0) {
				
				Asiento asientoFiltrado= (Asiento) arg0;
				
				return asientoFiltrado.cumpleCondicionesDeSuperOferta();
			} 
		};
			
		return CollectionUtils.selectRejected(colAsientos, filtroPorSuperOferta);	
	}
	
	@SuppressWarnings("unchecked")
	protected Collection<Asiento> filtrarPorClaseDelAsiento(Collection<Asiento> colAsientos,final ClaseAsiento claseAsiento) {
		Predicate filtroPorAsiento = new Predicate() { 
			@Override
			public boolean evaluate(Object arg0) {
				
				Asiento asientoFiltrado= (Asiento) arg0;
				
				return asientoFiltrado.esDeLaMismaClaseDeAsiento(claseAsiento);
			} 
		};
			
		return CollectionUtils.select(colAsientos, filtroPorAsiento);	
	}
	
	@SuppressWarnings("unchecked")
	protected Collection<Asiento> filtrarPorUbicacionAsiento(Collection<Asiento> colAsientos, final UbicacionEnAvion ubicacionEnAvion) {
		
		Predicate filtroPorUbicacion = new Predicate() { 
			@Override
			public boolean evaluate(Object arg0) {
				
				Asiento asientoFiltrado= (Asiento) arg0;
				
				return asientoFiltrado.esDelMismoTipoDeUbicacion(ubicacionEnAvion);
			} 
		};
			
		return CollectionUtils.select(colAsientos, filtroPorUbicacion);	
	}

	public Collection<Asiento> buscarAsientosSinSuperOfertas(Busqueda busqueda) {
		
		return this.sacarSuperOfertas(this.buscarAsientos(busqueda));
	}
	
	
	
	
	public void setPorcentajeImpuesto(BigDecimal porcentajeImpuesto) {
		this.porcentajeImpuesto = porcentajeImpuesto;
	}

	public BigDecimal getPorcentajeImpuesto() {
		return porcentajeImpuesto;
	}
	
	}
